const HealthReport = require('../models/HealthReport');
const path = require('path');
const fs = require('fs');

// 上传健康报告
exports.uploadReport = async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ message: '请上传文件' });
    }

    const { title, report_date, description } = req.body;
    // 只保存相对路径
    const file_path = path.join('uploads', req.file.filename);

    const report = await HealthReport.create({
      user_id: req.user.id,
      title,
      report_date,
      description,
      file_path
    });

    res.status(201).json(report);
  } catch (err) {
    console.error('上传健康报告错误:', err.message);
    // 如果出错，删除已上传的文件
    if (req.file) {
      fs.unlink(req.file.path, (unlinkErr) => {
        if (unlinkErr) {
          console.error('删除文件失败:', unlinkErr);
        }
      });
    }
    res.status(500).json({ message: '服务器错误' });
  }
};

// 获取用户所有健康报告
exports.getUserReports = async (req, res) => {
  try {
    const reports = await HealthReport.findAllByUserId(req.user.id);
    res.json(reports);
  } catch (err) {
    console.error('获取健康报告错误:', err.message);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 根据ID获取健康报告
exports.getReportById = async (req, res) => {
  try {
    const { id } = req.params;
    const report = await HealthReport.findById(id);

    if (!report) {
      return res.status(404).json({ message: '健康报告不存在' });
    }

    // 验证报告所有权
    if (report.user_id !== req.user.id) {
      return res.status(403).json({ message: '没有权限访问此报告' });
    }

    res.json(report);
  } catch (err) {
    console.error('获取健康报告错误:', err.message);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 更新健康报告
exports.updateReport = async (req, res) => {
  try {
    const { id } = req.params;
    const { title, report_date, description } = req.body;

    // 验证报告所有权
    const report = await HealthReport.findById(id);

    if (!report) {
      return res.status(404).json({ message: '健康报告不存在' });
    }

    if (report.user_id !== req.user.id) {
      return res.status(403).json({ message: '没有权限修改此报告' });
    }

    const updated = await HealthReport.update(id, { title, report_date, description });

    if (updated) {
      const updatedReport = await HealthReport.findById(id);
      res.json(updatedReport);
    } else {
      res.status(400).json({ message: '更新健康报告失败' });
    }
  } catch (err) {
    console.error('更新健康报告错误:', err.message);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 删除健康报告
exports.deleteReport = async (req, res) => {
  try {
    const { id } = req.params;

    // 验证报告所有权
    const report = await HealthReport.findById(id);

    if (!report) {
      return res.status(404).json({ message: '健康报告不存在' });
    }

    if (report.user_id !== req.user.id) {
      return res.status(403).json({ message: '没有权限删除此报告' });
    }

    // 删除文件
    if (report.file_path) {
      const filePath = path.join(__dirname, '..', report.file_path);
      fs.unlink(filePath, (unlinkErr) => {
        if (unlinkErr) {
          console.error('删除文件失败:', unlinkErr);
        }
      });
    }

    const deleted = await HealthReport.delete(id);

    if (deleted) {
      res.json({ message: '健康报告已成功删除' });
    } else {
      res.status(400).json({ message: '删除健康报告失败' });
    }
  } catch (err) {
    console.error('删除健康报告错误:', err.message);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 下载健康报告
exports.downloadReport = async (req, res) => {
  try {
    const { id } = req.params;
    const report = await HealthReport.findById(id);

    if (!report) {
      return res.status(404).json({ message: '健康报告不存在' });
    }

    // 验证报告所有权
    if (report.user_id !== req.user.id) {
      return res.status(403).json({ message: '没有权限下载此报告' });
    }

    // 拼接绝对路径
    const filePath = path.join(__dirname, '..', report.file_path);
    
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      return res.status(404).json({ message: '文件不存在' });
    }

    // 获取文件名
    const fileName = path.basename(filePath);
    
    // 设置响应头
    res.setHeader('Content-Disposition', `attachment; filename=${encodeURIComponent(fileName)}`);
    res.setHeader('Content-Type', 'application/octet-stream');
    
    // 创建文件流并发送
    const fileStream = fs.createReadStream(filePath);
    fileStream.pipe(res);
  } catch (err) {
    console.error('下载健康报告错误:', err.message);
    res.status(500).json({ message: '服务器错误' });
  }
}; 